ARM汇编指令 | 您所在的位置:网站首页 › 汇编 lsl › ARM汇编指令 |
1. ldr/str内存访问 ldr ,x0,[x8,#4] 把x8+4指向的内存加载到x0 str ,x0,[x8,#8] 把x0指向的内存存储到x8+8地址上.
2. mov指令 mov r0,r1 //r1值赋值给r0 mov r0,r1 ,lsl #3 //
3.加减指令 add x0,x1,x2 // x0 = x1 + x2 sub x0,x1,x2 //x0 = x1-x2
4.比较指令 cmp x0,x1 //比较指令,相等EQ,否则NQ tst x0, 0x01 //测试指令,判度x0最低位是否为0,tst是作与(&)操作,结果为0,EQ生效,否则NQ teq r0, r1 //判断r0是否等于r1, 等于EQ生效,否则NQ 这三个指令,都影响CPSR的状态位(Z) 5. 跳转指令 bne addr1 //cmp不相等时,跳转 beq addr2 //cmp相等时,跳转 6.逻辑操作 and x0,x0,#0xF // x0= x0&0xF orr x0,x0,#0xF // x0 = 0x || 0xF eor x0,x0,#0xF /// 亦或操作 7.入栈/出栈指令 STP x29, x30, [sp, #0x10] ; 入栈指令 LDP x29, x30, [sp, #0x10] ; 出栈指令 8. STM/LDM指令 格式: LDM{cond} mode Rn{!}, reglist{^} //(load much)多数据加载,将地址上的值加载到寄存器上 STM{cond} mode Rn{!}, reglist{^}//(store much)多数据存储,将寄存器的值存到地址上 其中: Rn:基址寄存器,装有传送数据的起始地址,Rn不允许为R15; !:表示最后的地址写回到Rn中; reglist:可包含多于一个寄存器范围,用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大顺序排列; ^:不允许在用户模式和系统模式下运行,() 主要用途:现场保护、数据复制、参数传送等,共有8种模式(前面4种用于数据块的传输,后面4种是堆栈操作)如下: (1)IA:(Increase After) 每次传送后地址加4,其中的寄存器从左到右执行,例如:STMIA R0,{R1,LR} 先存R1,再存LR (2)IB:(Increase Before)每次传送前地址加4,同上 (3)DA:(Decrease After)每次传送后地址减4,其中的寄存器从右到左执行,例如:STMDA R0,{R1,LR} 先存LR,再存R1 (4)DB:(Decrease Before)每次传送前地址减4,同上 (5)FD: 满递减堆栈 (每次传送前地址减4) (6)FA: 满递增堆栈 (每次传送后地址减4) (7)ED: 空递减堆栈 (每次传送前地址加4) (8)EA: 空递增堆栈 (每次传送后地址加4) 注意:其中在数据块的传输中是STMDB和LDMIA对应,STMIA和LDMDB对应 而在堆栈操作是STMFD和LDMFD对应,STMFA和LDMFA对应 LDMIA R0! ,{R3-R9} ;加R0指向的地址上连续空间的数据,保存到R3-R9当中,!表示R0值更新 STMIA R1!,{R3-R9} ;将R3-R9的数据存储到R1指向的地址上,R1值更新 ldmia sp, {r0 - pc}^ : 把堆栈内容恢复到ro- pc寄存器. "^" 表示把SPSR赋值给CPSR寄存器 9. MRS和MSR指令 MRS: 状态寄存器到通用寄存器的传送指令。 mrs r0 cpsr //r0 = cpsr MSR: 通用寄存器到状态寄存器的传送指令 msr cpsr r0 //cprs = r0 10 push和pop指令 push 和pop时ARMv8的入栈宏定义指令,用stp/ldp实现 push x0,x1 //入栈 pop x0,x1 //出栈 11.CBZ 和 CBNZ 比较,为零则跳转;比较,为非零则跳转。 语法 CBZ Rn, label CBNZ Rn, label
|
CopyRight 2018-2019 实验室设备网 版权所有 |